﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GIFT
{
    public class Actividad
    {
        //Constructor de la clase
        public Actividad(String nombre, String descripcion, String fechaActualizacion)
        {
            //Llena los atributos por defecto
            Nombre = nombre;
            Descripcion = descripcion;
            FechaActualizacion = fechaActualizacion;
            Id = "-1";
            Tipo = "";
            EstadoInicial = "";
            EstadoFinal = "";
            Cardinalidad = "";
            Repetible = "";
            Masiva = "";
            Plazo = "";
            Comandos = new ArrayList();
            Relaciones = new ArrayList();
        }

        //Constructor de la clase
        public Actividad(String nombre, String descripcion, String fechaActualizacion, String id, String tipo, String estadoInicial, String estadoFinal, String cardinalidad, String masiva, String plazo, String repetible)
        {
            //Llena los atributos por defecto
            Nombre = nombre;
            Descripcion = descripcion;
            FechaActualizacion = fechaActualizacion;
            Id = id;
            Tipo = tipo;
            EstadoInicial = estadoInicial;
            EstadoFinal = estadoFinal;
            Cardinalidad = cardinalidad;
            Repetible = repetible;
            Masiva = masiva;
            Plazo = plazo;
            Comandos = new ArrayList();
        }

        /************************* Metodos Set ********************/
        
        //Le da valor al atributo Id
        public void setId(String id)
        {
            Id = id;
        }

        //Le da valor al atributo nombre
        public void setNombre(String nombre)
        {
            Nombre = nombre;
        }

        //Le da valor al atributo descripcion
        public void setdescripcion(String descripcion)
        {
            Descripcion = descripcion;
        }

        //Le da valor al atributo fechaActualizacion
        public void setFechaActualizacion(String fecha)
        {
            FechaActualizacion = fecha;
        }

        //Le da valor al atributo tipo
        public void setTipo(String tipo)
        {
            Tipo = tipo;
        }

        //Le da valor al estado inicial Actividad
        public void setEstadoInicial(String inicial)
        {
            EstadoInicial = inicial;
        }

        //Le da valor al estado final Actividad
        public void setEstadoFinal(String final)
        {
            EstadoFinal = final;
        }

        //Le asigna el valor al plazo de la actividad
        public void setPlazo(String valor)
        {
            Plazo = valor;
        }

        //Le da valor a la cardinalidad de la actividad
        public void setCardinalidad(String cardinalidad)
        {
            Cardinalidad = cardinalidad;
        }

        //Le da valor a la ocpion de repetible de la actividad
        public void setRepetible(String valor)
        {
            Repetible = valor;
        }

        //Le da valor a la ocpion de masiva de la actividad
        public void setMasiva(String valor)
        {
            Masiva = valor;
        }

        //Le da valor a los comandos de una actividad
        public void setComandos(ArrayList comandos)
        {
            Comandos.Clear();
            for (int i = 0; i < comandos.Count; ++i)
            {
                Comandos.Add(comandos[i].ToString());
            }
        }
        //Le da valor a las relaciones de una actividad
        public void setRelaciones(ArrayList relaciones)
        {
            Relaciones.Clear();
            for (int i = 0; i < relaciones.Count; ++i)
            {
                Relaciones.Add(relaciones[i].ToString());
            }
        }

        /************************* Metodos Get ********************/

        //Retorna el valor del atributo Id
        public String getId()
        {
             return Id;
        }

        //Retorna el valor del atributo nombre
        public String getNombre()
        {
            return Nombre;
        }

        //Retorna el valor del atributo descripcion
        public String getdescripcion()
        {
            return Descripcion;
        }

        //Retorna el valor del atributo fechaActualizacion
        public String getFechaActualizacion()
        {
            return FechaActualizacion;
        }

        //Retorna el valor del atributo tipo
        public String getTipo()
        {
            return Tipo;
        }

        //Retorna el estado inicial Actividad
        public String getEstadoInicial()
        {
            return EstadoInicial;
        }

        //Retorna el estado final Actividad
        public String getEstadoFinal()
        {
            return EstadoFinal;
        }

        //Retorna el valor al plazo de la actividad
        public String getPlazo()
        {
            return Plazo;
        }

        //Retorna la cardinalidad de la actividad
        public String getCardinalidad()
        {
            return Cardinalidad;
        }

        //Retorna la ocpion de repetible de la actividad
        public String getRepetible()
        {
            return Repetible;
        }

        //Retorna la ocpion de masiva de la actividad
        public String getMasiva()
        {
            return Masiva;
        }

        //Retorna los comandos de una actividad
        public ArrayList getComandos()
        {
            return Comandos;
        }
        //Retorna las relaciones de una actividad
        public ArrayList getRelaciones()
        {
            return Relaciones;
        }

        /************************* Metodos Principales ********************/

        //Modifica el comando
        public void modificar(String nombre, String descripcion,String idformulario, String tipo)
        {
            Nombre = nombre;
            Descripcion = descripcion;
            FechaActualizacion = DateTime.Now.ToString();
            Tipo = tipo;
        }

        //Agrega los datos especificos en la relacion 
        public void agregar_relacion(RelacionActividades nueva)
        {
            Relaciones.Add(nueva);
        }
        //Retorna el indice en el que se encuentra ubicada una actividadRelacionada en lista_de_relaciones
        //o un -1 si no existe relacion
        public int posicion_de_actividadRelacionada(String actividadRelacionada)
        {
            int posicion = -1;
            bool actividad_encontrada = false;
            for (int x = 0; ((x < Relaciones.Count) && (!actividad_encontrada)); ++x)
            {
                RelacionActividades temporal = (RelacionActividades)Relaciones[x];
                if (temporal.get_actividadRelacionada() == actividadRelacionada)
                {
                    posicion = x;
                    actividad_encontrada = true;
                }
            }
            return posicion;
        }
        //Modifica los datos especificos de la relacion que se encuentre en la 
        //ubicacion_en_lista de la lista_de_relaciones
        public void modificar_datos_de_lista_relaciones(int ubicacion_en_lista, String actividadRelacionada, String relacion, String tipoRelacion)
        {
            RelacionActividades temp = (RelacionActividades)Relaciones[ubicacion_en_lista];
            temp.set_actividadRelacionada(actividadRelacionada);
            temp.set_relacion(relacion);
            temp.set_tipoRelacion(tipoRelacion);
        }
        //Borra una relacion de la lista de relaciones
        public void borrar_relaciones(String nombre_actividad_relacionada) {
            int posicion = this.posicion_de_actividadRelacionada(nombre_actividad_relacionada);
            if(posicion!=-1){
                Relaciones.RemoveAt(posicion);
            }
        }
        //Retorna una clase relacion con los datos especificos de la relacion que se encuentre en la 
        //ubicacion_en_lista de la lista_de_relaciones
        public RelacionActividades obtener_datos_de_relacion(int ubicacion_en_lista)
        {
            return (RelacionActividades)Relaciones[ubicacion_en_lista];
        }
        //Variables globales
        private String Id;
        private String Nombre;
        private String Descripcion;
        private String FechaActualizacion;
        private String Tipo;
        private String EstadoInicial;
        private String EstadoFinal;
        private String Cardinalidad;
        private String Repetible;
        private String Plazo;
        private String Masiva;
        private ArrayList Comandos;
        private ArrayList Relaciones;
    }
}
